Vim初学笔记

GO


0. Vim初相识

0.1 Vim简介

Vim是从Vi发展出来,第一个版本由布拉姆米勒在1991年发布,它基于VIM许可证,兼容GPL。官网www.vim.org

0.2 Vim的安装和使用

  • 安装:yum install -y vim-enhanced
  • 使用:vim filename

1. Vim的模式

(这节内容摘抄自Vim-维基百科

Vim有6种基本模式和5种派生模式:

1.1 基本模式

  • 普通模式

在普通模式中,用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。

在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按”a”(append/追加)键或者”i”(insert/插入)键。

  • 插入模式

在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。

在插入模式中,可以按ESC键回到普通模式。

  • 可视模式

这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。Vim的”文本对象”也能和移动命令一样用在这个模式中。

  • 选择模式

这个模式和无模式编辑器的行为比较相似(Windows标准文本控件的方式)。这个模式中,可以用鼠标或者光标键高亮选择文本,不过输入任何字符的话,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。

  • 命令行模式

在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(”:”键),搜索(”/“和”?”键)或者过滤命令(”!”键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。

  • Ex模式

这和命令行模式比较相似,在使用”:visual”命令离开Ex模式前,可以一次执行多条命令。

1.2 派生模式

  • 操作符等待模式

这个派生模式指普通模式中,执行一个操作命令后Vim等待一个”动作”来完成这个命令。Vim也支持在操作符等待模式中使用”文本对象”作为动作,包括”aw”一个单词(a word)、”as”一个句子(a sentence)、”ap”一个段落(a paragraph)等等。

比如,在普通模式下”d2as”删除当前和下一个句子。在可视模式下”apU”把当前段落所有字母大写。

  • 插入普通模式

这个模式是在插入模式下按下ctrl-o键的时候进入。这个时候暂时进入普通模式,执行完一个命令之后,Vim返回插入模式

  • 插入可视模式

这个模式是在插入模式下按下ctrl-o键并且开始一个可视选择的时候开始。在可视区域选择取消的时候,Vim返回插入模式。

  • 插入选择模式

通常这个模式由插入模式下鼠标拖拽或者shift方向键来进入。当选择区域取消的时候,Vim返回插入模式。

  • 替换模式

这是一个特殊的插入模式,在这个模式中可以做和插入模式一样的操作,但是每个输入的字符都会覆盖文本缓冲中已经存在的字符。在普通模式下按”R”键进入。

1.3 其它

  • Evim(Easy Vim)

Evim(Easy Vim)是一个特殊的GUI模式用来尽量的表现的和”无模式”编辑器一样。编辑器自动进入并且停留在插入模式,用户只能通过菜单、鼠标和键盘控制键来对文本进行操作。可以在命令行下输入”evim”或者”vim -y”进入。在Windows下,通常也可以点击桌面上Evim(Easy Vim)的图标。

1.4 说明

一般情况下,我们通常只使用三种模式(其它的模式可能会在我们使用过程中不经意就会用上,所以初学时不要在模式上花费太大的精力,只需要搞懂这常用的三种就足够了):

  • 普通模式
  • 插入模式
  • 命令行模式

以下的内容也是针对这三种常用模式的学习。


2. Vim的使用

2.1 进入Vim

  • vim 进入Vim软件环境
  • vim filename 用Vim打开或新建一个文件

2.2 三种常用模式之间的切换

2.2.1 进入普通模式

  • 一般用Vim打开文件时的默认模式就是普通模式。
  • 如果是在别的模式下,按Esc键 就会切换到普通模式。
  • 同上,按 Ctrl+C 或者 Ctrl+[ 效果也同 按Esc键

2.2.2 进入插入模式

一般是从默认的普通模式进入到插入模式,常用的方式如下表所示:

按键 说明
i 在当前光标的前面插入
I 在当前光标所在行的行首插入
a 在当前光标的后面插入
A 在当前光标所在行的行尾插入
o 在当前光标所在行的下面新插入一行
O 在当前光标所在行的上面新插入一行
cw 替换从光标所在位置后到一个单词结尾的字符

2.2.3 进入命令行模式

一般是从默认的普通模式进入到命令行模式,方式如下表所示:

按键 说明
冒号后面加一些命令
/ 进行查找替换时前面要用它
进行查找时前面要用它

2.2.4 关于模式之间相互切换的说明

  1. 普通模式和插入模之间可以相互切换。
  2. 普通模式和命令行模式之间可以相互切换。
  3. 插入模式和命令行模式之间不可以直接切换,只能先从一种模式中切换到普通模式,才能再切换到另一个模式。

2.3 光标移动

光标移动

按键 说明
h/左箭头
l/右箭头 右(小写L)
j/下箭头
k/上箭头

行间跳转

命令 说明
nG(n Shift+g) 光标移动到第n行
gg 光标移动到第一行
G(Shift+g) 到最后一行

小技巧:你在完成依次跳转后,可以使用Ctrl+o快速回到上一次(跳转前)光标所在位置,这个技巧很实用,比如当你在写代码时,忽然想起有个bug,需要修改,这时候你跳过去改好了,只需要按下Ctrl+o就可以回到你之前的位置。

行内跳转

命令 说明
w 到下一个单词的开头
e 到下一个单词的结尾
b 到前一个单词的开头
ge 到前一个单词的结尾
0或^ 到行头
$ 到行尾
f<字母> 向后搜索<字母>并跳转到第一个匹配的位置(非常实用)
F<字母> 向前搜索<字母>并跳转到第一个匹配的位置
t<字母> 向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用)
T<字母> 向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)

2.4 操作文本

2.4.1 删除文本

普通模式下删除Vim文本信息

操作 说明
x(小写) 删除光标所在的字符
X(大写) 删除光标所在前一个字符
Delete 同x
dd 删除(实际上是剪切,可用p来粘贴)光标所在行
dw 删除一个单词(不适合中文)
d$或D 删除至行尾
d^ 删除至行首
dG 删除至文档结尾处
d1G 删除至文档首部

除此之外,还可以在命令之前加上数字,表示多次删除1行,即一次删除多行。

2.4.2 复制粘贴和剪切

在普通模式下进行复制粘贴和剪切的操作

操作 说明
yy 复制光标所在行的整行
3yy 复制3行
y^ 复制至行首的第一个字符,不包含光标所在处字符
y0 同上
yw 复制一个单词
y2w 复制两个单词
yG 复制至文本末
y1G 复制至文本开头
p(小写) 粘贴至光标后(下)
P(大写) 粘贴至光标前(上)
dd 剪切光标所在行的整行
ddp 快速交换光标所在行与它下面的行
剪切的操作 同复制的操作一致,以此类推

2.4.3 替换和撤销(Undo)

在普通模式下进行

操作 说明
r+<待替换字母> 将光标所在字母替换为指定字母
R 连续替换,直到按下Esc
cc 替换整行,即删除光标所在行,并进入插入模式
cw 替换一个单词,即删除一个单词,并进入插入模式
C(大写) 替换光标以后至行末
~ 反转光标所在字母大小写
u{n} 撤销一次或n次操作
U(大写) 撤销当前行的所有修改
Ctrl+r redo,即撤销undo的操作

2.4.4 查找

在普通模式下进行

操作 说明
/<字符串> 向下进行查找
?<字符串> 向上进行查找
n(小写) 继续相同侧的查找
N(大写) 继续相反侧的查找
\* 向下查找光标所在处的单词
\# 向上查找光标所在处的单词
g\* 同\*,但部分符合该单词即可
g\# 同\#,但部分符合该单词即可

补充说明:

1
2
3
4
加入old中包含“/”这个字符就需要反斜杠|转换或将/换成#或@
1. :%s/\/etc\/old/new/g
2. :%s#/etc/old#new#g
3. :%s@/etc/old@new@g

2.4.5 快速缩进

使用快速缩进,用于格式化代码超爽,在普通模式下进行

操作 说明
>> 将整行向右缩进
<< 将整行向左回退
:set shiftwidth=n 设置缩进和回退的字符数(可以简写成sw)
:ce 使本行内容居中
:ri 使本行内容靠右
:le 使本行内容靠左

2.5 Vim重复命令和设置

2.5.1 Vim重复命令

  1. 重复执行上次命令:在普通模式下,.(小数点)表示重复上一次的命令操作。
  2. 执行指定次数相同的命令:在普通模式输入数字N,N表示重复后面操作的次数。几个例子如下:
    • 输入 10x ,删除10个连续字符
    • 输入 3dd ,将会删除3行文本
    • 在普通模式下,还可以使用dw或者daw(delete a word)删除一个单词,所以可以联想到dnw(n替换为相应数字)表示删除n个单词。

2.5.2 Vim常用设置

  • :set nu 显示行号
  • :set shiftwidth=n 设置缩进和回退的字符数(可以简写成sw–> :set sw=n )
  • :set nohl 取消查找关键字后的高亮

2.6 退出Vim

命令行模式下退出Vim

命令 说明
:q! 强制退出,不保存
:q 退出
:wq! 强制保存并退出
:w <文件路径> 另存为
:saveas <文件路径> 另存为
:x 保存并退出
:wq 保存并退出
  • 普通模式下输入 ZZ(Shift+zz) 即可退出(若文件改动,则保存,否则不保存)

3. Vim初学的补充

3.1. 正常模式下的命令格式

在正常模式下一个命令的格式是∶

[number] command object 或者 command [number] object

其意是∶

  • number - 代表的是命令执行的次数
  • command - 代表要做的事情,比如 d 代表删除
  • object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
  • $ (to the end of line), etc.

3.2. 括号匹配

如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的括号上。

3.3. 字符替换

  • 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
  • 在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
  • 在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
  • 在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
  • 进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc

3.4. Vim的在线帮助命令

Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方法之一∶

  • 按下 <HELP> 键 (如果键盘上有的话)
  • 按下 <F1> 键 (如果键盘上有的话)
  • 输入 :help <回车>
  • 输入 :q <回车> 可以关闭帮助窗口。

提供一个正确的参数给”:help”命令,您可以找到关于该主题的帮助。请试验以下参数(可别忘了按回车键哦)∶

  • :help w <回车>
  • :help insert-index <回车>
  • :help user-manual <回车>
  • vim手册,使用的命令是∶ :help user-manual

4. Vim高级功能

4.1. 多文件编辑

4.1.1 使用Vim编辑多个文件

编辑多个文件有两种形式,一种是在进入Vim前使用的参数就是多个文件,另一种就是进入Vim后再编辑其他的文件。

同时创建两个新文件并编辑:

  • vim 1.txt 2.txt 默认进入1.txt文件的编辑界面
  • 命令行模式下输入:n 编辑2.txt文件,可以加!即:n!强制切换,之前一个文件的输入内容没有保存,仅仅切换到另一个文件
  • 命令行模式下输入:N 编辑1.txt文件,可以加!即:N!强制切换,之前文件内的输入没有保存,仅仅是切换到另一个文件。

4.1.2 进入Vim后打开新文件

命令行模式下的操作:

操作 说明
:e 3.txt 打开新文件3.txt
:e# 回到前一个文件
:ls 可以列出以前编辑过的文档
:b 2.txt(或者编号) 可以直接进入文件2.txt编辑
:bd 2.txt(或者编号) 可以删除以前编辑过的列表中的文件项目
:e! 4.txt 新打开文件4.txt,放弃正在编辑的文件
:f 显示正在编辑的文件名
:f new.txt 改变正在编辑的文件名字为new.txt

4.1.3 恢复文件

如果因为断电等原因造成文档没有保存,可以采用恢复方式:

vim -r 进入文档后,输入:ewcover 1.txt来恢复。

4.2. 可视模式

  • 在普通模式下输入v(小写),进入字符选择模式,就可以移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。
  • 在普通模式下输入Shift+v(小写),进入行选择模式,按下V之后就会把整行选取,您可以上下移动光标选更多的行,同样,再按一次Shift+v就可以取消选取。
  • 在普通模式下输入Ctrl+v(小写),这是区域选择模式,可以进行矩形区域选择,再按一次Ctrl+v取消选取。
  • 在普通模式下输入d删除选取区域内容
  • 在普通模式下输入y复制选取区域内容

4.3. 视窗操作

vim可以在一个界面里打开多个窗口进行编辑,这些编辑窗口称为vim的视窗。打开方法有很多种,例如可以使用在命令行模式下输入:new 打开一个新的vim视窗,并进入视窗编辑一个新文件(普通模式下输入Ctrl+w也可以,但是Ctrl+w在chrome下会与chrome关闭标签页的快捷键冲突,所以使用该快捷键你可以在IE或其它浏览器进行练习),除了:new命令,下述列举的多种方法也可以在命令模式或普通模式下打开新的视窗:

  • 命令行模式下输入:sp 1.txt 打开新的横向视窗来编辑1.txt
  • 命令行模式下输入:vsp 2.txt 打开新的纵向视窗来编辑1.txt
  • 普通模式下Ctrl-w s 将当前窗口分割成两个水平的窗口
  • 普通模式下Ctrl-w v 将当前窗口分割成两个垂直的窗口
  • 普通模式下Ctrl-w q:q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
  • 普通模式下Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗
  • 普通模式下Ctrl-w j 移至下面视窗
  • 普通模式下Ctrl-w k 移至上面视窗
  • 普通模式下Ctrl-w h 移至左边视窗
  • 普通模式下Ctrl-w l 移至右边视窗
  • 普通模式下Ctrl-w J 将当前视窗移至下面
  • 普通模式下Ctrl-w K 将当前视窗移至上面
  • 普通模式下Ctrl-w H 将当前视窗移至左边
  • 普通模式下Ctrl-w L 将当前视窗移至右边
  • 普通模式下Ctrl-w - 减小视窗的高度
  • 普通模式下Ctrl-w + 增加视窗的高度

4.4. 文档加密

vim -x file1 输入您的密码确认密码这样在下一次打开时,vim就会要求你输入密码

4.5. 在Vim执行外部命令

在命令行模式中输入!可以执行外部的shell命令:

  • :!ls 用于显示当前目录的内容
  • :!rm FILENAME 用于删除名为 FILENAME 的文件
  • :w FILENAME 可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件

4.6. Vim的帮助系统

  • 普通模式下按<F1>打开vim自己预设的帮助文档
  • 命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
  • 命令行模式下输入:ver 显示版本及参数

4.7. 功能设定

4.7.1 Vim的功能设定

可以在编辑文件的时候进行功能设定,如命令行模式下输入:set nu(显示行数),设定值退出vim后不会保存。要永久保存配置需要修改vim配置文件。vim的配置文件~/.vimrc,可以打开文件进行修改,不过务必小心不要影响vim正常使用

4.7.2 获取目前的设定

  • 命令行模式下输入:set或者:se显示所有修改过的配置
  • 命令行模式下输入:set all 显示所有的设定值
  • 命令行模式下输入:set option? 显示option的设定值
    -命令行模式下输入:set nooption 取消当期设定值

4.7.3 set功能的说明

  • 命令行模式下输入:set autoindent(ai) 设置自动缩进
  • 命令行模式下输入:set autowrite(aw) 设置自动存档,默认未打开
  • 命令行模式下输入:set background=dark或light,设置背景风格
  • 命令行模式下输入:set backup(bk) 设置自动备份,默认未打开
  • 命令行模式下输入:set cindent(cin) 设置C语言风格缩进

5. Vim使用技巧总结

5.1. Vim一些常用使用技巧总结

操作 说明
Ctrl-C 回到普通模式
u / Ctrl+r 撤销/反撤销
9G / :9 定位到第9行
:9y 拷贝第9行
Ctrl-o 回到此前光标位置
ZZ / ZQ 保存并退出/无条件退出
= 格式化选定文本
ggvG 全选文件内容
gg=G 格式化文件
Shift-v 选取行
vip 选取光标所在段落
yit / dit / cit 对标签内的文本进行操作
mx 添加书签
`X 跳转到书签X
:marks 查看所有书签X
delm X 删除书签X
:ls 查看缓冲区
:bN 打开缓冲区N
:bn / bp / 缓冲区切换
:shell / :sh /!cmd 执行shell命令
Ctrl-z / fg 利用了Linux的作业机制,将Vim进程放到后台/前台执行,便于使用shell环境
vim -o *.py 打开当前目录下全部.py文件
:qa 退出全部窗口
vnew 垂直分屏
Ctrl-w r 切换缓冲区
:r filename 将文件读入到当前光标位置
Windo diffthis/diffof 对比当前打开的两个缓冲区
:e! 重新打开缓冲区
:s/foo/bar/gc 查找foo并将其替换成bar
:1?xxx / G?xxx 从文件末尾开始查找
Shift-k 查找光标所在命令或函数的man帮助
J 合并行
gi / gk 对于换行的段落的行移动
Ctrl-g 用于显示当前光标所在位置和文件状态信息。
:!command 用于执行一个外部命令 command。
:w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文件中。
:#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件FILENAME 中。
:r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置后面。

5.2. Vim键盘图

图一

Vim键盘图一

图二

Vim键盘图二

图三

Vim键盘图


OK

0%